home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload Trio 2
/
Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO
/
dir37
/
ushell.zip
/
SHELL
/
SH.H
< prev
next >
Wrap
C/C++ Source or Header
|
1990-02-19
|
16KB
|
526 lines
/* MS-DOS SHELL - Header File
*
* MS-DOS SHELL - Copyright (c) 1990 Data Logic Limited and Charles Forsyth
*
* This code is based on (in part) the shell program written by Charles
* Forsyth and is subject to the following copyright restrictions:
*
* 1. Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice is duplicated in the
* source form and the copyright notice in file sh6.c is displayed
* on entry to the program.
*
* 2. The sources (or parts thereof) or objects generated from the sources
* (or parts of sources) cannot be sold under any circumstances.
*
* $Header: sh.h 1.1 90/01/29 17:46:51 MS_user Exp $
*
* $Log: sh.h $
* Revision 1.1 90/01/29 17:46:51 MS_user
* Initial revision
*
*
*/
#define LINE_MAX 1000 /* Command line length */
#define HISTORY_MAX 100 /* History array length */
/* Space for full file name */
#define FFNAME_MAX (PATH_MAX + NAME_MAX + 4)
#define CMD_LINE_MAX 127 /* Max command line length */
#define SSAVE_IO_SIZE 4 /* Save IO array malloc increment */
#define NPUSH 8 /* limit to input nesting */
#define NOFILE 20 /* Number of open files */
#define NUFILE 10 /* Number of user-accessible files */
#define FDBASE 10 /* First file usable by Shell */
#define NL '\n'
#define SP ' '
#define NOT '^'
/* Open in create mode */
#define O_CMASK (O_WRONLY | O_CREAT | O_TRUNC | O_TEXT)
/* Open in create mode for a pipe */
#define O_PMASK (O_RDWR | O_CREAT | O_TRUNC | O_TEXT)
/* Open in create mode for swap file */
#define O_SMASK (O_RDWR | O_CREAT | O_TRUNC | O_BINARY)
#define O_RMASK (O_RDONLY | O_NOINHERIT | O_TEXT)
/*
* shell components
*/
#define QUOTE 0200
#define CMASK 0377
#define QMASK (CMASK & ~QUOTE)
#define NOBLOCK ((C_Op *)NULL)
#define NOWORD ((char *)NULL)
#define NOWORDS ((char **)NULL)
#define NOPIPE (-1)
/*
* Description of a command or an operation on commands.
* Might eventually use a union.
*/
typedef struct op {
int type; /* operation type, see below */
char **words; /* arguments to a command */
struct ioword **ioact; /* IO actions (eg, < > >>) */
struct op *left;
struct op *right;
char *str; /* identifier for case and for */
} C_Op;
#define TCOM 1 /* command */
#define TPAREN 2 /* (c-list) */
#define TPIPE 3 /* a | b */
#define TLIST 4 /* a [&;] b */
#define TOR 5 /* || */
#define TAND 6 /* && */
#define TFOR 7 /* FOR */
#define TDO 8 /* DO */
#define TCASE 9 /* CASE */
#define TIF 10 /* IF */
#define TWHILE 11 /* WHILE */
#define TUNTIL 12 /* UNTIL */
#define TELIF 13 /* ELSE IF */
#define TPAT 14 /* pattern in case */
#define TBRACE 15 /* {c-list} */
#define TASYNC 16 /* c & */
#define TFUNC 17 /* c () {c-list} */
/* Built in Command list */
struct builtin {
char *command;
int (*fn)(C_Op *);
};
/*
* actions determining the environment of a process
*/
#define FEXEC 0x0001 /* execute without forking */
/* MSDOS Memory Control Block chain structure */
#pragma pack (1)
struct MCB_list {
char MCB_type; /* M or Z */
unsigned int MCB_pid; /* Process ID */
unsigned int MCB_len; /* MCB length */
};
#pragma pack ()
#define MCB_CON 'M' /* More MCB's */
#define MCB_END 'Z' /* Last MCB's */
/* Externs for Swapper assembler function */
extern char cmd_line[]; /* Command line */
extern char path_line[]; /* Process path */
extern unsigned int SW_intr; /* interrupt pending */
extern unsigned int SW_Blocks; /* Number of blocks to read */
extern int SW_fp; /* File or EMS Handler */
extern unsigned int SW_I0_V_BX; /* Out interrupt Zero address */
extern unsigned int SW_I0_V_ES;
extern unsigned int SW_I23_V_ES; /* Our Interrupt 23 address */
extern unsigned int SW_I23_V_BX;
extern unsigned long SW_EMstart; /* Start addr of extend mem */
extern unsigned int SW_Mode; /* Type of swapping to do */
/* 1 - disk */
/* 2 - Extended memory */
/* 3 - Expanded memory */
extern unsigned int SW_EMSFrame; /* EMS Frame segment */
extern int Swap_Mode; /* Swapping mode */
/* If you change these values, change sh7, swap_device as well */
#define SWAP_OFF 0x0000 /* No swapping */
#define SWAP_DISK 0x0001 /* Disk only */
#define SWAP_EXTEND 0x0002 /* Extended memory */
#define SWAP_EXPAND 0x0004 /* Expanded memory */
/*
* flags to control evaluation of words
*/
#define DOSUB 0x01 /* interpret $, `, and quotes */
#define DOBLANK 0x02 /* perform blank interpretation */
#define DOGLOB 0x04 /* interpret [?* */
#define DOKEY 0x08 /* move words with `=' to 2nd arg. list */
#define DOTRIM 0x01 /* trim resulting string */
#define DOALL (DOSUB | DOBLANK | DOGLOB | DOKEY | DOTRIM)
extern char *Copy_Right1;
extern char *Copy_Right2;
extern char **dolv; /* $<numeric> values */
extern int dolc; /* $<numeric> count */
extern int fn_area_number; /* Next function area number */
extern int exstat;
extern char gflg;
extern int talking; /* interactive (talking-type */
extern int execflg;
extern int multiline; /* \n changed to ; */
extern int *failpt;
extern int *errpt;
extern int inparse; /* In parser flag */
extern int Current_Event; /* Current history event */
/*
* Break/Continue (in for and while), Return and Exit handler
*/
typedef struct brkcon {
jmp_buf brkpt;
struct brkcon *nextlev;
} Break_C;
/* Values returned by longjmp */
#define BC_LOAD 0 /* Load condition */
#define BC_BREAK 1 /* Break condition */
#define BC_CONTINUE 2 /* Continue condition */
extern Break_C *Break_List; /* Break list for FOR/WHILE */
extern Break_C *Return_List; /* Return list for RETURN */
extern Break_C *SShell_List; /* SubShell list for EXIT */
extern bool level0; /* Level zero (read profile) */
extern bool r_flag; /* Read only shell */
extern bool History_Enabled;
/*
* Save Standard Input/Output/Error structure
*/
typedef struct save_io {
int depth; /* Execute recursive depth */
int fp[STDERR_FILENO + 1]; /* File handlers */
} Save_IO;
extern Save_IO *SSave_IO; /* Save IO array */
extern int NSave_IO_E; /* Number of entries */
extern int MSave_IO_E; /* Max Number of entries */
/*
* Function tree processing
*/
typedef struct fun_op {
struct fun_op *next; /* Link */
C_Op *tree; /* The tree itself */
} Fun_Ops;
extern Fun_Ops *fun_list; /* List header */
/*
* redirection
*/
typedef struct ioword {
short io_unit; /* unit affected */
short io_flag; /* action (below) */
char *io_name; /* file name */
} IO_Actions;
#define IOREAD 1 /* < */
#define IOHERE 2 /* << (here file) */
#define IOWRITE 4 /* > */
#define IOCAT 8 /* >> */
#define IOXHERE 16 /* ${}, ` in << */
#define IODUP 32 /* >&digit */
#define IOCLOSE 64 /* >&- */
#define IODEFAULT (-1) /* token for default IO unit */
/*
* parsing & execution environment
*/
typedef struct env {
char *cline; /* Current line buffer */
char *linep; /* Current pointer in line */
char *eline; /* End of line pointer */
struct io *iobase;
struct io *iop;
int *errpt;
int iofd;
struct env *oenv; /* Previous environment */
} Environ;
extern Environ e;
/*
* here documents
*/
typedef struct here {
char *h_tag;
int h_dosub;
IO_Actions *h_iop;
struct here *h_next;
} Here_D;
/*
* flags:
*
* -a: Set all environment variables to exported
* -e: Quit on error
* -f: Disable file name expansion
* -k: Look for name=value everywhere on command line
* -n: No execution
* -t: exit after reading and executing one command
* -u: Abort if environment variable is not set
* -v: Echo as read
* -x: Trace
*/
#define FL_TEST(x) (flags & (1L << ((x) - 'a')))
#define FL_SET(x) flags |= (1L << ((x) - 'a'))
#define FL_CLEAR(x) flags &= (~(1L << ((x) - 'a')))
extern long flags;
extern char *null; /* null value for variable */
extern long ourtrap; /* Signal processing required */
extern int trapset; /* trap pending */
extern int yynerrs; /* yacc */
extern int Execute_stack_depth; /* execute function recursion */
/* depth */
/*
* Variable list
*/
typedef struct var {
char *value; /* Value */
char *name; /* Name */
struct var *next; /* Link */
char status; /* Type, see below */
} Var_List;
#define COPYV 1 /* flag to setval, suggesting copy */
#define RONLY 0x01 /* variable is read-only */
#define EXPORT 0x02 /* variable is to be exported */
#define GETCELL 0x04 /* name & value space was got with getcell */
#define PONLY 0x08 /* PATH Value - no unset */
#define C_MSDOS 0x10 /* Convert to MSDOS format */
extern Var_List *vlist; /* dictionary */
extern Var_List **S_UL; /* Start address update location */
extern Var_List *path; /* search path for commands */
extern Var_List *ps1; /* Prompt 1 */
extern Var_List *ps2; /* Prompt 2 */
extern Var_List *ifs; /* Interfield separators */
extern Var_List *C_dir; /* Current directory */
extern char *last_prompt; /* Last prompt output */
extern char *home; /* Home string */
extern char *shell; /* Shell string */
extern char *hsymbol; /* Hash string */
extern char *msymbol; /* Minus string */
extern char *spcl2;
extern char *history_file;
/*
* SubShell Save Structure
*/
typedef struct subshell {
int depth; /* Sub_Shell Depth */
Var_List *header; /* Header start */
} S_SubShell;
extern S_SubShell *SubShells; /* Save Vars array */
extern int NSubShells; /* Number of entries */
extern int MSubShells; /* Max Number of entries */
/* io buffer */
typedef struct iobuf {
unsigned int id; /* buffer id */
char buf[512]; /* buffer */
char *bufp; /* pointer into buffer */
char *ebufp; /* pointer to end of buffer */
} IO_Buf;
/* possible arguments to an IO function */
typedef struct ioarg {
char *aword;
char **awordlist;
int afile; /* file descriptor */
unsigned int afid; /* buffer id */
long afpos; /* file position */
IO_Buf *afbuf; /* buffer for this file */
} IO_Args;
#define AFID_NOBUF (~0)
#define AFID_ID 0
extern IO_Args ioargstack[NPUSH]; /* IO argument stack */
/* an input generator's state */
typedef struct io {
int (*iofn)(struct io *);
IO_Args *argp;
int peekc;
char prev; /* previous character read by readc() */
char nlcount; /* for `'s */
char xchar; /* for `'s */
char task; /* reason for pushed IO */
char dflag; /* Special processing flag */
} IO_State;
#define DSA_NULL 0x00 /* No special processing req */
#define DSA_STAR 0x01 /* Special processing for "$*" */
#define DSA_AMP 0x02 /* Special processing for "$@" */
#define DSA_MODE 0x03 /* Mode flag */
#define DSA_END 0x04 /* Last word processing */
#define DSA_START 0x08 /* First word processed? */
#define DSA_START1 0x10 /* Subsequent word processed */
#define DSA_END1 0x20 /* End processing for word */
extern IO_State iostack[NPUSH]; /* IO Stack */
#define XOTHER 0 /* none of the below */
#define XDOLL 1 /* expanding ${} */
#define XGRAVE 2 /* expanding `'s */
#define XIO 3 /* file IO */
/* in substitution */
#define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL)
/*
* IO control
*/
extern IO_Args temparg; /* temporary for PUSHIO */
#define PUSHIO(what,arg,gen) ((temparg.what = (arg)), pushio(&temparg,(gen)))
#define RUN(what,arg,gen) ((temparg.what = (arg)), run(&temparg,(gen)))
typedef struct wdblock {
short w_bsize;
short w_nword;
char *w_words[1];
} Word_B;
extern Word_B *wdlist;
extern Word_B *iolist;
/*
* storage allocation
*/
extern int areanum; /* current allocation area */
#define NEW(type) (type *)getcell (sizeof (type))
#define DELETE(obj) freecell ((char *)obj)
/* Functions */
extern void main (int, char **);
extern void setdash (void);
extern void fail (void);
extern void leave (void);
extern void print_warn (char *, ...);
extern void print_error (char *, ...);
extern bool newenv (int);
extern void quitenv (void);
extern char *putn (int);
extern void next (int);
extern void onintr (int);
extern char *space (int);
extern char *strsave (char *, int);
extern void sig (int);
extern void runtrap (int);
extern Var_List *lookup (char *, bool);
extern void setval (Var_List *, char *);
extern void s_vstatus (Var_List *, int);
extern bool isassign (char *);
extern bool assign (char *, int);
extern bool gmatch (char *, char *, bool);
extern char *getcell (unsigned int);
extern void freecell (char *);
extern void freearea (int);
extern void setarea (char *, int);
extern int getarea (char *);
extern C_Op *yyparse (void);
extern int execute (C_Op *, int, int, int);
extern int run (IO_Args *, int (*)(IO_State *));
extern int Getc (int);
extern void unget (int);
extern int eofc (void);
extern int readc (void);
extern void pushio (IO_Args *, int (*)(IO_State *));
extern int nlchar (IO_State *);
extern int wdchar (IO_State *);
extern int dol_char (IO_State *);
extern int strchar (IO_State *);
extern int qstrchar (IO_State *);
extern int filechar (IO_State *);
extern int gravechar (IO_State *);
extern int qgravechar (IO_State *);
extern int linechar (IO_State *);
extern void closeall (void);
extern int remap (int);
extern int openpipe (void);
extern void closepipe (int);
extern void markhere (char *, IO_Actions *);
extern void gethere (void);
extern int herein (char *, int);
extern void scraphere (void);
extern void freehere (int);
extern char **eval (char **, int);
extern char **makenv (void);
extern char *evalstr (char *, int);
extern int subgetc (char, int);
extern Word_B *addword (char *, Word_B *);
extern char **getwords (Word_B *);
extern void put_prompt (char *);
extern bool eqname (char *, char *);
extern bool any (char, char *);
extern int (*inbuilt (char *))();
extern char *path_append (char *, char *, char *);
extern void unset (char *, bool);
extern int S_open (bool, char *, int, ...);
extern int S_close (int, bool);
extern int S_dup (int);
extern int S_dup2 (int, int);
extern void S_Remap (int, int);
extern void S_Delete (int);
extern void Getcwd (void);
extern char *g_tempname (void);
extern void S_puts (char *);
extern void S_putc (int);
extern bool check_rsh (char *);
extern int O_for_execute (char *);
extern int SA_spawn (char **);
extern char *findeq (char *);
extern int restore_std (int);
extern void Load_History (void);
extern void Dump_History (void);
extern void Display_History (void);
extern void Clear_History (void);
extern void v1_puts (char *);
extern void v1a_puts (char *);
extern void v1_putc (char);
extern void v1printf (char *, ...);
extern int Get_stdin (IO_Args *);
extern int Process_Escape (char **);
extern void Add_History (bool);
extern void Convert_Slashes (char *);
extern void Print_ExTree (C_Op *);
extern Fun_Ops *Fun_Search (char *);
extern void Save_Function (C_Op *, bool);
extern int getn (char *);
extern int Create_NG_VL (void);
extern void Delete_G_VL (void);
extern void Restore_Dir (void);
extern void Restore_Environment (int, int);
extern int sort_compare (char **, char **);
extern int Check_Script (char *);